package com.yy.wga.mp.module.pay.client.response.wechat;

import com.alibaba.fastjson.annotation.JSONField;
import com.yy.wga.mp.module.pay.client.response.BaseRefundResponse;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @Author: gc
 * @Date: 2021/6/13
 * @Description:
 **/
@EqualsAndHashCode(callSuper = true)
@Data
@ToString(callSuper = true)
public class WechatRefundResponse extends BaseRefundResponse {
    private static final long serialVersionUID = -7020048489142763347L;

    /**
     * 响应编码
     */
    private String code;

    /**
     * 失败信息
     */
    private String message;

    /**
     * 微信支付退款单号
     */
    @JSONField(name = "refund_id")
    private String refundId;

    /**
     * 商户系统内部的退款单号
     */
    @JSONField(name = "out_refund_no")
    private String outRefundNo;

    /**
     * 微信支付订单号
     */
    @JSONField(name = "transaction_id")
    private String transactionId;

    /**
     * 原支付交易对应的商户订单号
     */
    @JSONField(name = "out_trade_no")
    private String outTradeNo;

    /**
     * 退款渠道，
     * ORIGINAL：原路退款
     * BALANCE：退回到余额
     * OTHER_BALANCE：原账户异常退到其他余额账户
     * OTHER_BANKCARD：原银行卡异常退到其他银行卡
     */
    @JSONField(name = "channel")
    private String channel;

    /**
     * 退款入账账户
     */
    @JSONField(name = "user_received_account")
    private String userReceivedAccount;

    /**
     * 退款成功时间，当退款状态为退款成功时有返回。示例值：2020-12-01T16:18:12+08:00
     */
    @JSONField(name = "success_time")
    private String successTime;

    /**
     * 退款受理时间 示例值：2020-12-01T16:18:12+08:00
     */
    @JSONField(name = "create_time")
    private String createTime;

    /**
     * 退款状态 SUCCESS：退款成功
     * CLOSED：退款关闭
     * PROCESSING：退款处理中
     * ABNORMAL：退款异常
     */
    private String status;

    /**
     * 退款所使用资金对应的资金账户类型
     * 枚举值
     *  UNSETTLED : 未结算资金
     *  AVAILABLE : 可用余额
     *  UNAVAILABLE : 不可用余额
     *  OPERATION : 运营户
     *  BASIC : 基本账户（含可用余额和不可用余额）
     */
    @JSONField(name = "funds_account")
    private String fundsAccount;

    /**
     * 金额详细信息
     */
    private Amount amount;

    /**
     * 优惠退款信息
     */
    @JSONField(name = "promotion_detail")
    private PromotionDetail promotionDetail;

    @Data
    public static class Amount {


        /**
         * 总金额
         */
        private Long total;

        /**
         * 退款金额，单位为分
         */
        @NotNull
        private Long refund;

        /**
         * 退款需要从指定账户出资时
         */
        private List<From> from;

        /**
         * 现金支付金额，单位为分
         */
        @JSONField(name = "payer_total")
        private Long payerTotal;

        /**
         * 退款给用户的金额，不包含所有优惠券金额
         */
        @JSONField(name = "payer_refund")
        private Long payerRefund;

        /**
         * 去掉非充值代金券退款金额后的退款金额，单位为分，退款金额=申请退款金额-非充值代金券退款金额
         */
        @JSONField(name = "settlement_refund")
        private Long settlementRefund;

        /**
         * 应结订单金额=订单金额-免充值代金券金额，单位为分
         */
        @JSONField(name = "settlement_total")
        private Long settlementTotal;

        /**
         * 退款金额-代金券或立减优惠退款金额为现金，单位为分
         */
        @JSONField(name = "discount_refund")
        private Long discountRefund;

        /**
         * 手续费退款金额，单位为分
         */
        @JSONField(name = "refund_fee")
        private Long refundFee;

        /**
         * CNY：人民币，境内商户号仅支持人民币。
         */
        private String currency;

        @Data
        public static class From {

            /**
             * 出资账户类型，AVAILABLE : 可用余额，UNAVAILABLE : 不可用余额
             */
            private String account;

            /**
             * 出资金额，单位分
             */
            private Long amount;
        }
    }

    @Data
    public static class PromotionDetail {

        /**
         * 券或者立减优惠id
         */
        @JSONField(name = "promotion_id")
        private String promotionId;

        /**
         * 优惠范围 GLOBAL：全场代金券 SINGLE：单品优惠
         */
        private String scope;

        /**
         * 优惠类型 COUPON：代金券，需要走结算资金的充值型代金券 DISCOUNT：优惠券，不走结算资金的免充值型优惠券
         */
        private String type;

        /**
         * 优惠券面额
         */
        private String amount;

        @JSONField(name = "refund_amount")
        /**
         * 商品退款金额，单位为分
         */
        private Long refundAmount;


        /**
         * 单品列表
         */
        @JSONField(name = "goods_detail")
        private List<GoodsDetail> goodsDetail;

        @Data
        public static class GoodsDetail {

            /**
             * 商户侧商品编码
             */
            @JSONField(name = "merchant_goods_id")
            private String merchantGoodsId;

            /**
             * 微信侧商品编码
             */
            @JSONField(name = "wechatpay_goods_id")
            private String wechatpayGoodsId;

            /**
             * 商品名称
             */
            @JSONField(name = "goods_name")
            private String goodsName;

            /**
             * 商品单价
             */
            @JSONField(name = "unit_price")
            private Long unit_price;

            @JSONField(name = "refund_amount")
            /**
             * 商品退款金额，单位为分
             */
            private Long refundAmount;

            /**
             * 单品的退款数量
             */
            @JSONField(name = "refund_quantity")
            private Long refundQuantity;
        }
    }
}